﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;

namespace SIMCRepositorio
{
    public interface IRepositorioPortafolioUsuario
    {
        int CrearAociacionConUsuario(PortafolioDeUsuario p_PortafolioUsuario);
        IList<PortafolioDeUsuario> BuscarPortafolioUsuarios(int p_IdPortafolio);        
        PortafolioDeUsuario BuscarPortafolioUsuario(int p_IdPortafolioUsuario);        
        List<PortafolioPermiso> BuscarPortafolioPermisos();
        void EliminarAsociacionPortafolioDeUsuario(int p_Id);
        void CambiarEstadoPortafolioUsuario(PortafolioDeUsuario p_PortafolioUsuario);
        int BuscarUsuarioCreador(PortafolioDeUsuario p_PortafolioUsuario);
        void GuardarAlias(int p_IdPortafolioUsuario, string p_Alias);
        PortafolioPermiso BuscarPortafolioPermisos(string nombreUsuario, int idPortafolio, string tipoPermiso);
    }

    public class RepositorioPortafolioUsuario : Database, IRepositorioPortafolioUsuario
    {
        public int CrearAociacionConUsuario(PortafolioDeUsuario p_Portafoliousuario)
        {
            try
            {
                adm_portafolio_usuario portafolioUsuario = new adm_portafolio_usuario
                {
                    usp_cestado = p_Portafoliousuario.Estado.ToString(),
                    usp_fult_acceso = p_Portafoliousuario.UltimoAcceso,
                    usp_fult_cambio = p_Portafoliousuario.FechaUltimoCambio,
                    usp_icartera = p_Portafoliousuario.IdPortafolio,
                    usp_iuser_creador = p_Portafoliousuario.UsuarioCreador,
                    usp_iuser_interno = p_Portafoliousuario.IdUsuarioUltimoCambio,
                    usp_salias = p_Portafoliousuario.Alias,
                    usp_suser = p_Portafoliousuario.UserName
                };

                Insertar(portafolioUsuario);

                foreach (PortafolioPermiso item in p_Portafoliousuario.ListaPermisos)
                {
                    CrearAsociacionPortafolioPermiso(portafolioUsuario.usp_id, item);
                }

                return portafolioUsuario.usp_id;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<PortafolioDeUsuario> BuscarPortafolioUsuarios(int p_IdPortafolio)
        {
            try
            {
                var query = from valor in Context.adm_portafolio_usuario
                            where valor.usp_icartera == p_IdPortafolio
                            select new PortafolioDeUsuario
                            {
                                _Estado = valor.usp_cestado.TrimEnd(),
                                UltimoAcceso = valor.usp_fult_acceso,
                                FechaUltimoCambio = valor.usp_fult_cambio,
                                IdPortafolio = valor.usp_icartera,
                                UsuarioCreador = valor.usp_iuser_creador,
                                IdUsuarioUltimoCambio = valor.usp_iuser_interno,
                                Alias = valor.usp_salias,
                                UserName = valor.usp_suser,
                                Id = valor.usp_id
                            };

                return query.ToList();
            }
            catch (Exception)
            {
                throw;
            }
        }        

        private void CrearAsociacionPortafolioPermiso(int p_IdPortafolio, PortafolioPermiso p_Permiso)
        {
            try
            {
                adm_portafolio_permisos permiso = new adm_portafolio_permisos
                {
                    upp_scodigo_permiso = p_Permiso.Codigo,
                    upp_icodigo_portafolio_usuario = p_IdPortafolio
                };

                Insertar(permiso);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<PortafolioPermiso> BuscarPortafolioPermisos()
        {
            try
            {
                var query = from valor in Context.adm_portafolio_tipo_permiso
                            select new PortafolioPermiso
                            {
                                Codigo = valor.tup_scodigo,
                                Descripcion = valor.tup_sdescripcion
                            };

                return query.ToList();
            }
            catch (Exception)
            {

                throw;
            }
        }

        public void EliminarAsociacionPortafolioDeUsuario(int p_IdPortafolioUsuario)
        {
            try
            {
                var query = from permiso in Context.adm_portafolio_permisos
                            where permiso.upp_icodigo_portafolio_usuario == p_IdPortafolioUsuario
                            select permiso;

                foreach (adm_portafolio_permisos item in query)
                {
                    Context.DeleteObject(item);
                }

                adm_portafolio_usuario i_Temp = new adm_portafolio_usuario
                {
                    usp_id = p_IdPortafolioUsuario
                };

                Eliminar(i_Temp);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void CambiarEstadoPortafolioUsuario(PortafolioDeUsuario p_PortafolioUsuario)
        {
            try
            {
                var query = from portafoliousuario in Context.adm_portafolio_usuario
                            where portafoliousuario.usp_id == p_PortafolioUsuario.Id
                            select portafoliousuario;

                adm_portafolio_usuario i_portafoliousuario = query.SingleOrDefault();

                if (i_portafoliousuario != null)
                {
                    i_portafoliousuario.usp_cestado = p_PortafolioUsuario._Estado;
                    Context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int BuscarUsuarioCreador(PortafolioDeUsuario p_PortafolioUsuario)
        {
            try
            {
                var query = from usuario in Context.adm_portafolio_usuario
                            where usuario.usp_id == p_PortafolioUsuario.Id
                            select usuario.usp_iuser_creador;

                int? resultado = query.SingleOrDefault();

                if (resultado == null)
                    return 0;
                else
                    return resultado.Value;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public PortafolioDeUsuario BuscarPortafolioUsuario(int p_IdPortafolioUsuario)
        {
            try
            {
                var query = from valor in Context.adm_portafolio_usuario
                            where valor.usp_id == p_IdPortafolioUsuario
                            select new
                            {
                                PortafolioUsuario = valor,
                                PortafolioPermiso = from permiso in Context.adm_portafolio_permisos
                                                    join tipopermiso in Context.adm_portafolio_tipo_permiso
                                                        on permiso.upp_scodigo_permiso equals tipopermiso.tup_scodigo
                                                    where permiso.upp_icodigo_portafolio_usuario == p_IdPortafolioUsuario
                                                    select new PortafolioPermiso
                                                    {
                                                        Codigo = tipopermiso.tup_scodigo,
                                                        Descripcion = tipopermiso.tup_sdescripcion,
                                                        Id = permiso.upp_iId
                                                    }
                            };

                var p = query.SingleOrDefault();

                if (p != null)
                {
                    return new PortafolioDeUsuario
                    {
                        _Estado = p.PortafolioUsuario.usp_cestado.TrimEnd(),
                        UltimoAcceso = p.PortafolioUsuario.usp_fult_acceso,
                        FechaUltimoCambio = p.PortafolioUsuario.usp_fult_cambio,
                        IdPortafolio = p.PortafolioUsuario.usp_icartera,
                        UsuarioCreador = p.PortafolioUsuario.usp_iuser_creador,
                        IdUsuarioUltimoCambio = p.PortafolioUsuario.usp_iuser_interno,
                        Alias = p.PortafolioUsuario.usp_salias,
                        UserName = p.PortafolioUsuario.usp_suser,
                        Id = p.PortafolioUsuario.usp_id,
                        ListaPermisos = p.PortafolioPermiso.ToList()
                    };
                }

                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public void GuardarAlias(int p_IdPortafolioUsuario, string p_Alias)
        {
            try
            {
                var query = from portafoliousuario in Context.adm_portafolio_usuario
                            where portafoliousuario.usp_id == p_IdPortafolioUsuario
                            select portafoliousuario;

                adm_portafolio_usuario t_PortafolioUsuarioEncontrado = query.Single();

                t_PortafolioUsuarioEncontrado.usp_salias = p_Alias;

                Context.SaveChanges();
            }
            catch (Exception ex) 
            {
                throw ex;
            }
        }

        public PortafolioPermiso BuscarPortafolioPermisos(string p_NombreUsuario, int p_IdPortafolio, string p_TipoPermiso)
        {
            try
            {
                var query = from asociacion in Context.adm_portafolio_usuario
                            join tipoPermiso in Context.adm_portafolio_permisos
                                on asociacion.usp_id equals tipoPermiso.upp_icodigo_portafolio_usuario
                            where asociacion.usp_suser == p_NombreUsuario &&
                            asociacion.usp_icartera == p_IdPortafolio && 
                            tipoPermiso.upp_scodigo_permiso == p_TipoPermiso 
                            select new PortafolioPermiso
                            {
                                Codigo = tipoPermiso.upp_scodigo_permiso,
                                Id = tipoPermiso.upp_iId
                            };

                return query.SingleOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
